package demo.thread;

import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * java.util.concurrent包下的线程池相关类：避免频繁创建和释放线程的开销，提高利用率。
 * 线程池接口：ExecutorService
 * 线程池接口的实现类：ThreadPoolExecutor(不推荐用该类配置线程池)
 * 创建线程池的工具类：Executors(JDK强烈建议大家使用它的四个静态方法配置线程池)
 * 线程池通过事先建好一定数量的线程，等待任务的到来即可执行任务。用完后放回池以备下一次任务使用。
 * @author david
 *
 */
public class ThreadPoolDemo {
	public static void main(String[] args) {
		//ExecutorService pool = Executors.newSingleThreadExecutor();//线程池只有一个线程在工作，相当于单线程串行执行所有任务
		//ExecutorService pool = Executors.newFixedThreadPool(10);//创建固定大小的线程池
		ExecutorService pool = Executors.newCachedThreadPool();//创建一个可缓存的线程池。如果线程池的大小不够用，系统会回收部分空闲（60秒不执行任务）的线程任务。能创建的最大线程依赖于系统或者JVM 能创建的数量
		//ExecutorService pool = Executors.newScheduledThreadPool(10);//创建一个可反复执行任务的线程池
		/*for (int i = 0; i < 10; i++) {
			pool.execute(new Runnable() {		
				public void run() {
					// TODO Auto-generated method stub
					for (int k = 0; k < 3; k++) {
						System.out.println(Thread.currentThread().getName()+"在执行"+k);
					}
				}
			});
		}*/
		pool.shutdown();//关闭线程池
		
		scheduledMethod();
	}
	
	//反复执行任务的线程池
	public static void scheduledMethod(){
		ScheduledExecutorService pool = Executors.newScheduledThreadPool(10);
		pool.scheduleAtFixedRate(new Runnable() {
			public void run() {
				System.out.println("-----------------"+new Date());
			}
		}, 3000, 1000, TimeUnit.MILLISECONDS);//3秒钟以后，每隔一秒钟反复执行一个Runnable

	}
}
